!  Global Village Gold/Silver/Merc
!	Author:	Kris Kreutzman
!
!	Copyright:	 1991-1996 Apple Computer, Inc.	All Rights Reserved.
!
!	revision history:
!		v2.1	as shipped with the ARA 2.1
!       v2.2	update CARRIER/CONNECT parsing
!
!  'mlts' resource info for this modem:
!    byte 1 == 01 -> modem HAS built-in error correction protocols
!    byte 2 == 01 -> modem HAS built-in data compression protocols
!    byte 3 == 33 -> max number of chars in varstr 7
!    byte 4 == 33 -> max number of chars in varstr 8
!    byte 5 == 33 -> max number of chars in varstr 9
!	
@ORIGINATE
@ANSWER
!
! ---- Initial modem setup ----
!
! Set serial port speed depending upon the compression flag
!	A higher rate with compression on to handle expanded data from the modem
!	A lower rate closer to the DCE when compression is off
! 
ifstr 5 1 "0"
serreset 38400, 0, 8, 1
jump 2
!
@LABEL 1
serreset 19200, 0, 8, 1
!
@LABEL 2
hsreset 0 0 0 0 0 0
settries 0
!
! Get the modem's attention
!
matchclr
matchstr 1 3 "OK\13\10"
write "AT\13"
matchread 30
!
@LABEL 3
!
! Setup the modem for the following:
!   Reset to factory settings
!   Standard compression/reliablity
!   Lock serial port speed
!   Serial port hardware handshaking, turn off software handshaking
!   Verbose responces and compression/protocol results
!   CONNECT returns DCE speed
!   Turn off answering
!   Reset or return to command mode on DTR toggle (optional)
!
matchclr
matchstr 1 4   "OK\13\10"
matchstr 2 101 "ERROR\13\10"
write "AT&FE0W1\\J0\\N3&D3\\Q2S7=75S0=0\13"
matchread 30
inctries
iftries 3 101
!
! Reset the Modem on setup failure
!
DTRClear
pause 5
DTRSet
flush
jump 3
!
!
@LABEL 4
!
! Set hardware handshaking for TelePort modems, ignore error from PowerPorts
write "AT&K3\13"
pause 10
flush
!
! Varstring 4 , reliable link protocol:
!    = 0, handled by computer (ARAP)
!    = 1, handled by modem (PPP)
!    = 2, MNP10 protocol (Cellular protocol, no longer supported)
ifstr 4 5 "1"
ifstr 4 5 "2"
!
! Varstring 4 == 0, turn off reliable link protocol in modem (ARAP)
matchclr
matchstr 1 9 "OK\13\10"
write "AT\\N0\13"
matchread 30
jump 101
!
!
@LABEL 5
! Varstring 5, compression protocol:
!    = 0, handled by computer 
!    = 1, handled by modem
ifstr 5 9 "1"
!
! Varstring 5 == 0, turn off compression protocol in modem.
matchclr
matchstr 1 9 "OK\13\10"
write "AT%C0\13"
matchread 30
jump 101
!
!
@LABEL 9
! Varstring 2, modem speaker:
!    = 0, speaker off
!    = 1, speaker on
ifstr 2 13 "1"
pause 5
matchclr
matchstr 1 13 "OK\13\10"
write "ATM0\13"
matchread 30
jump 101
!
! Modem ready, wait for a call or originate a call
!
@LABEL 13
ifANSWER 32
!
!
! ---- Originating a call ----
!
! Varstring 6, dialing mode:
!    = 0, normal dialing
!    = 1, blind dialing
!    = 2, manual dialing
!    otherwise dial as ARA version 1.0
ifstr 6 19 "0"
ifstr 6 17 "1"
ifstr 6 15 "2"
!
! Dialing for ARA version 1.0
note "Dialing ^1" 3
write "ATD^3\^^1\13
jump 32
!
@LABEL 15
! Display ASK dialog with message.  Goto label 107 if dialog canceled.
ASK 2 "Pick up the phone & dial ^1.  When the phone rings, click OK then hang up." 107
note "Manual dialing initiated" 3
! X1 to ignore dialtone & busy, D to dial, \^ generates data tone
write "ATX1D\^\13"
jump 32
!
@LABEL 17
note "Dialing without tone" 3
matchclr
matchstr 1 19 "OK\13\10"
! X1 to ignore dialtone & busy
write "ATX1\13"
matchread 30
jump 101
!
!
!
@LABEL 19
! Display the full dialstring contained in Varstring 1
note "Dialing ^1" 3
!
! Varstrings 7, 8 and 9, contain dialstring fragments
!    Long phone numbers may need to be split into smaller groups
!    for the modem to use
!
! Varstring 3:  "p" for pulse & "t" for tone dialing
! Varstring 8 == blank (dialstring in varstring 7)
! Varstring 9 == blank (dialstring in varstrings 7 & 8)
! Otherwise (dialstring in varstrings 7, 8 & 9)
! \^ is added to the dialstring to force the modem to generate a data tone
ifstr 8 27 " "
ifstr 9 24 " "
!
!  Write dialstring in varstrings 7, 8 & 9
matchclr
matchstr 1 21 "OK\13\10"
write "ATD^3\^^7;\13"
matchread 400
jump 101

@LABEL 21
matchclr
matchstr 1 22 "OK\13\10"
write "ATD^3^8;\13"
matchread 400
jump 101

@LABEL 22
write "ATD^3^9\13"
jump 32
!
!
@LABEL 24
!  Write dialstring in varstrings 7 & 8
matchclr
matchstr 1 25 "OK\13\10"
write "ATD^3\^^7;\13"
matchread 400
jump 101

@LABEL 25
write "ATD^3^8\13"
jump 32
!
@LABEL 27
!  Write dialstring in varstring 7
write "ATD^3\^^7\13"
!
!
!    ---- Connection responce ----
!
! The following section will parse modem responces of two types:
!   1) CARRIER xxx, PROTOCOL: yyy, COMPRESSION: yyy, CONNECT xxx
!   2) CONNECT xxx/yyy
!
@LABEL 32
settries 0
@LABEL 33
matchclr
matchstr  1 81  "RING\13\10"
matchstr  2 102 "NO DIALTONE\13\10"
matchstr  3 103 "NO CARRIER"
matchstr  4 103 "ERROR\13\10"
matchstr  5 104 "BUSY\13\10"
matchstr  6 105 "NO ANSWER\13\10"
matchstr  7 35  "CONNECT"
matchstr  8 34  "CARRIER"
matchstr  9 62  "PROTOCOL: LAP"
matchstr 10 62  "PROTOCOL: MNP"
matchstr 11 62  "PROTOCOL: ALT"
matchstr 12 67  "COMPRESSION: V"
matchstr 13 67  "COMPRESSION: MNP5"
matchstr 14 67  "COMPRESSION: CLASS"
matchread 700
ifANSWER 32
jump 105
!
!  CARRIER parsing
!
@LABEL 34
jsr 38
inctries
jump 33
!
!  CONNECT parsing - do not parse rate if CARRIER seen
!
@LABEL 35
iftries 1 61
jsr 38
jump 61
!
!  Parse CONNECT/CARRIER rate subroutine
!    2400 and 4800 have two entries each
!    to distinguish them from 24000 and 48000
!
@LABEL 38
matchclr
matchstr  1 40 "2400\13"
matchstr  2 40 "2400/"
matchstr  3 41 "4800\13"
matchstr  4 41 "4800/"
matchstr  5 42 "7200"
matchstr  6 43 "9600"
matchstr  7 44 "12000"
matchstr  8 45 "14400"
matchstr  9 46 "16800"
matchstr 10 47 "19200"
matchstr 11 48 "21600"
matchstr 12 49 "24000"
matchstr 13 50 "26400"
matchstr 14 51 "28800"
matchread 10
jump 59
!
! -- Connection rates --
! CommunicatingAt informs ARA of the raw modem to modem
! connection speed.
!
@LABEL 40
note "Communicating at 2400 bps." 2
CommunicatingAt 2400
jump 60
!
@LABEL 41
note "Communicating at 4800 bps." 2
CommunicatingAt 4800
jump 60
!
@LABEL 42
note "Communicating at 7200 bps." 2
CommunicatingAt 7200
jump 60
!
@LABEL 43
note "Communicating at 9600 bps." 2
CommunicatingAt 9600
jump 60
!
@LABEL 44
note "Communicating at 12400 bps." 2
CommunicatingAt 12400
jump 60
!
@LABEL 45
note "Communicating at 14400 bps." 2
CommunicatingAt 14400
jump 60
!
@LABEL 46
note "Communicating at 16800 bps." 2
CommunicatingAt 16800
jump 60
!
@LABEL 47
note "Communicating at 19200 bps." 2
CommunicatingAt 19200
jump 60
!
@LABEL 48
note "Communicating at 21600 bps." 2
CommunicatingAt 21600
jump 60
!
@LABEL 49
note "Communicating at 24000 bps." 2
CommunicatingAt 24000
jump 60
!
@LABEL 50
note "Communicating at 26400 bps." 2
CommunicatingAt 26400
jump 60
!
@LABEL 51
note "Communicating at 28800 bps." 2
CommunicatingAt 28800
jump 60
!
@LABEL 59
note "Communicating at an unknown rate." 2
!
@LABEL 60
return
!
! Look for reliablilty and compression results 
! after the CONNECT rate.
!
@LABEL 61
matchclr
matchstr  1 63 "LAPM"
matchstr  2 63 "REL"
matchstr  3 63 "ARQ"
matchstr  4 68 "COMP/"
matchstr  5 68 "COMP\13"
matchstr  6 63 "V42/"
matchstr  7 63 "V42\13"
matchstr  8 68 "V42BIS"
matchstr  9 68 "V42bis"
matchstr 10 63 "MNP\13"
matchstr 11 68 "MNP5"
matchstr 12 70 "\10"
matchread 10
jump 70

! -- Modem error correction link negotiation --
! Userhook 2 informs ARA that a modem-to-modem error
! correcting protocol has been negotiated
!
!
@LABEL 62
note "Modem Reliable Link Established." 2
userhook 2
jump 33
!
@LABEL 63
note "Modem Reliable Link Established." 2
userhook 2
jump 61
!
! -- Compression negotiation --
! Userhook 3 informs ARA that a modem-to-modem compression
! protocol has been negotiated
!
@LABEL 67
note "Modem Compression Established." 2
userhook 3
jump 33
!
@LABEL 68
note "Modem Compression Established." 2
userhook 3
jump 61
!
!
! -- Normal exit after "CONNECT" --
!
!  This modem has been setup to do CTS handshaking,
!  and we assume that a CTS handshaking cable is being used.
!
@LABEL 70
! Turn on CTS handshaking.
HSReset 0 1 0 0 0 0
!
ifANSWER 71
pause 30
@LABEL 71
exit 0
!
!
! ---- Answer calls ----
!
!	A RING result from the modem and in ANSWERING mode
!	claims the serial port and answering the phone
!
@LABEL 81
ifORIGINATE 32
userhook 1
note "Answering phone..." 2
write "ATA\13"
jump 32
!
!
! ---- Hang up and reset modem ----
!
@HANGUP
@LABEL 90
settries 0
HSReset 0 0 0 0 0 0
!
@LABEL 92
!  Escape from data to command mode
matchclr
matchstr 1 96 "OK\13\10"
write "+++"
matchread 20
!
@LABEL 94
! Force a hangup
matchclr
matchstr 1 98 "NO CARRIER\13\10"
matchstr 2 98 "OK\13\10"
matchstr 3 98 "ERROR\13\10"
matchstr 4 98 "0\13\10"
write "ATH\13"
matchread 30
! 
! Try to get control of the modem by toggling DTR
DTRClear
pause 5
DTRSet
flush
!
! Try the hangup sequence three times otherwise declare and error
inctries
iftries 3 101
jump 92
!
@LABEL 96
! Pause between data and command mode
pause 50
jump 94
!
!
@LABEL 98
! Recall the factory settings
pause 15
matchclr
matchstr 1 99 "OK\13\10"
write "AT&F\13"
matchread 30
jump 101
!
@LABEL 99
exit 0
!
! ---- Error messages -----
!
! Modem Not Responding
@LABEL 101
exit -6019
!
! No Dial Tone
@LABEL 102
exit -6020
!
! No Carrier or Error
@LABEL 103
exit -6021
!
! Busy
@LABEL 104
exit -6022
!
! No Answer
@LABEL 105
exit -6023
!
! User Cancellation
@LABEL 107
exit -6008